import sys
import os
import subprocess
import time
import threading
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QVBoxLayout,
    QHBoxLayout, QPushButton, QLabel,
    QComboBox, QWidget, QGroupBox
)
from PyQt5.QtCore import QThread, pyqtSignal, QObject  # <- вот здесь теперь есть QObject
import uiautomator2 as u2  # Для автоматизации UI на Android

# Глобальные переменные
devices_by_model = {}  # Словарь для хранения устройств: модель -> serial

# Сигналы для обновления GUI из потоков
class Signals(QObject):
    device_scan_completed = pyqtSignal(list)  # Сигнал для обновления списка устройств

signals = Signals()

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()
        self.connect_signals()
        self.scan_devices_async()  # Автоматическое сканирование при запуске

    def init_ui(self):
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)

        # Группа для выбора устройства и сценария
        device_group = QGroupBox("Выбор устройства и смена IP")
        device_layout = QVBoxLayout(device_group)

        # Комбо-бокс для выбора модели устройства
        self.device_combobox = QComboBox()
        self.device_combobox.addItem("Нет подключённых устройств")
        self.device_combobox.currentTextChanged.connect(self.on_model_selected)
        device_layout.addWidget(QLabel("Выберите устройство:"))
        device_layout.addWidget(self.device_combobox)

        # Кнопка для сканирования устройств
        self.scan_devices_button = QPushButton("Сканировать устройства")
        self.scan_devices_button.clicked.connect(self.scan_devices_async)
        device_layout.addWidget(self.scan_devices_button)

        # Кнопка для запуска сценария смены IP
        self.change_ip_button = QPushButton("Сменить IP на выбранном устройстве")
        self.change_ip_button.clicked.connect(self.run_flight_mode_scenario)
        device_layout.addWidget(self.change_ip_button)

        main_layout.addWidget(device_group)

    def connect_signals(self):
        signals.device_scan_completed.connect(self.update_device_list)

    def scan_devices_async(self):
        """Асинхронное сканирование подключённых устройств через ADB"""
        def worker():
            global devices_by_model
            devices_by_model.clear()
            try:
                result = subprocess.run(["adb", "devices", "-l"], capture_output=True, text=True, check=False)
                output = result.stdout.strip().splitlines()
                for line in output[1:]:  # Пропускаем первую строку
                    line = line.strip()
                    if not line or "offline" in line or "unauthorized" in line or "unknown" in line:
                        continue
                    parts = line.split()
                    serial = parts[0]
                    model = None
                    for p in parts:
                        if p.startswith("model:"):
                            model = p.split(":", 1)[1]
                            break
                    if not model:
                        model = "UnknownModel"
                    devices_by_model[model] = serial
                print(f"Обнаруженные устройства: {devices_by_model}")
            except Exception as e:
                print(f"Ошибка при сканировании устройств: {e}")

            model_list = list(devices_by_model.keys())
            signals.device_scan_completed.emit(model_list)

        thread = threading.Thread(target=worker, daemon=True)
        thread.start()

    def update_device_list(self, model_list):
        """Обновление комбо-бокса списком устройств"""
        self.device_combobox.clear()
        if model_list:
            self.device_combobox.addItems(model_list)
        else:
            self.device_combobox.addItem("Нет подключённых устройств")

    def on_model_selected(self, model):
        """Обработчик выбора модели устройства"""
        print(f"Выбрана модель: {model}")

    def run_flight_mode_scenario(self):
        """Сценарий смены IP: включение/выключение авиарежима и tethering на выбранном устройстве"""
        chosen_model = self.device_combobox.currentText()
        if chosen_model == "Нет подключённых устройств" or chosen_model not in devices_by_model:
            print("Ошибка: Не выбрано устройство или оно недоступно.")
            return

        serial = devices_by_model[chosen_model]
        try:
            print(f"Запуск сценария на устройстве '{chosen_model}' (serial: {serial}).")
            d = u2.connect(serial)  # Подключение к устройству через uiautomator2
            print(f"Информация об устройстве: {d.device_info}")

            # Шаг 1: Открыть настройки авиарежима
            subprocess.run(["adb", "-s", serial, "shell", "am", "start", "-a", "android.settings.AIRPLANE_MODE_SETTINGS"])
            time.sleep(0.3)

            # Шаг 2: Переключить авиарежим (вкл/выкл)
            switch_element = d(resourceId="android:id/switch_widget")
            if switch_element.exists(timeout=3):
                switch_element.click()  # Включить/выключить
                time.sleep(0.3)
                switch_element.click()  # Вернуть в исходное (для цикла)
                time.sleep(0.5)
            else:
                print("Ошибка: Переключатель авиарежима не найден.")

            # Шаг 3: Активировать tethering (мобильный hotspot для смены IP)
            d.app_start("com.android.settings", ".TetherSettings")
            time.sleep(0.3)
            if d(resourceId="com.android.settings:id/recycler_view").child(index=0).exists(timeout=2):
                d(resourceId="com.android.settings:id/recycler_view").child(index=0).click()
                time.sleep(0.3)
            else:
                print("Ошибка: Элемент tethering не найден.")

            # Шаг 4: Закрыть настройки (нажатие 'back' несколько раз)
            for _ in range(3):
                d.press("back")
                time.sleep(0.2)

            print("Сценарий смены IP завершён. Ожидайте подключения к новой сети.")
            time.sleep(1)  # Задержка для стабилизации соединения

        except Exception as e:
            print(f"Ошибка при выполнении сценария: {e}")

def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
